package w.z.x.framework.repository.interfaces;

import w.z.x.framework.repository.structures.Segment;
import w.z.x.framework.repository.wrappers.LambdaDeleteWrapper;
import w.z.x.framework.repository.wrappers.LambdaQueryWrapper;
import w.z.x.framework.repository.wrappers.LambdaUpdateWrapper;
import w.z.x.framework.repository.wrappers.StringQueryWrapper;

/**
 * Wrappers 定义
 *
 * @author 魏祖潇
 */
public interface Wrapper<T> {

    /**
     * LambdaQueryWrapper
     *
     * @param <T> 泛型
     * @return LambdaQueryWrapper
     */
    static <T> LambdaQueryWrapper<T> lambdaQueryWrapper() {
        return new LambdaQueryWrapper<T>();
    }

    /**
     * LambdaUpdateWrapper
     *
     * @param <T> 泛型
     * @return LambdaUpdateWrapper
     */
    static <T> LambdaUpdateWrapper<T> lambdaUpdateWrapper() {
        return new LambdaUpdateWrapper<T>();
    }

    /**
     * StringQueryWrapper
     *
     * @param <T> 泛型
     * @return StringQueryWrapper
     */
    static <T> StringQueryWrapper<T> stringQueryWrapper() {
        return new StringQueryWrapper<T>();
    }

    /**
     * LambdaDeleteWrapper
     *
     * @param <T> 泛型
     * @return LambdaDeleteWrapper
     */
    static <T> LambdaDeleteWrapper<T> lambdaDeleteWrapper() {
        return new LambdaDeleteWrapper<T>();
    }

    /**
     * where语句
     *
     * @return 语句片段
     */
    Segment whereSegment();

    /**
     * 获取偏移量
     *
     * @return 偏移量
     */
    int offset();

    /**
     * 获取限制量
     *
     * @return 限制量
     */
    int limit();

    /**
     * 设置偏移量
     *
     * @param offset 偏移量
     * @return Wrapper
     */
    Wrapper<T> offset(int offset);

    /**
     * 设置限制量
     *
     * @param limit 限制量
     * @return Wrapper
     */
    Wrapper<T> limit(int limit);

}
